package testSocketUDP.viejo;

import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import actualizador.Datagrama;
import actualizador.DatoEquipo;
import actualizador.EstadisticaCliente;
import actualizador.Mensaje;
import utiles.IDatosEquipoRemoto;
import utiles.IMensaje;

public class TestServidorBroadcast extends Thread{
	private int nroMensaje= 0;
	private boolean continuar= true;
	private DatoEquipo ipS= new DatoEquipo("10.12.9.71");
	private List<EstadisticaCliente> listaClientes= new ArrayList<EstadisticaCliente>();
	
	private int totalMensajesPerdidos, totalMensajesRecibidos, nroMensajeEsperado= 0, ultimoMensajeRecibido;
	
	public TestServidorBroadcast(String ipServidor) {
		if(ipServidor != null)
			this.ipS= new DatoEquipo(ipServidor);
	}
	
	@Override
	public void run() {
		int timeout= 0;
		IMensaje m, r;		
		IDatosEquipoRemoto ipc;
		System.out.println("Iniciando servidor en Ip:"+ipS);
		Datagrama dg= new Datagrama();
		
		while(continuar){
			try {
				System.out.println("Esperando clientes...");
				m= dg.recibirMensaje(timeout);
				ipc= ((Mensaje)m).getDatosEquipoRemoto();
				System.out.println("Llego cliente: "+ipc);
				System.out.println("Mensaje recibido: "+m);
				this.registrarCliente(m);				
				r= new Mensaje(nroMensaje++, ipS, "Adios");
				System.out.println("Respuesta enviada: "+r+", al cliente: "+ipc);
				dg.enviarMensaje(ipc.getIp(), r);
			
			} catch (SocketTimeoutException e) {
				e.printStackTrace();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				dg.cerrarDatagrama();
			}
			
			imprimirEstadisticas();
		}
	}
	
	private void registrarCliente(IMensaje m){
		if(m.getNroMensaje() == nroMensajeEsperado){
			nroMensajeEsperado++;
		}else{
			totalMensajesPerdidos+= m.getNroMensaje()-ultimoMensajeRecibido;
			nroMensajeEsperado= m.getNroMensaje()+1;
		}
		
		ultimoMensajeRecibido= m.getNroMensaje();
		totalMensajesRecibidos++;
		
		EstadisticaCliente dt= new EstadisticaCliente();
		dt.setIdCliente(((Mensaje)m).getDatosEquipoRemoto().getID());
		if(!listaClientes.contains(dt))
			listaClientes.add(dt);
	}
	
	private void imprimirEstadisticas(){
		System.out.println("totalMensajesPerdidos: "+totalMensajesPerdidos+". totalMensajesRecibidos: "+totalMensajesRecibidos+
				". nroMensajeEsperado: "+nroMensajeEsperado+". ultimoMensajeRecibido: "+ultimoMensajeRecibido);
	}
	
	public boolean isContinuar(){
		return continuar;
	}
	
	public void detener(){
		continuar= false;
	}
	
	public List<EstadisticaCliente> getListaClientes(){
		return listaClientes;
	}
	
	public static void main(String[] args) {
		(new TestServidorBroadcast(null)).start();
	}
	
}
